package br.ucb.rest.negocio.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import org.apache.log4j.Logger;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.ucb.rest.negocio.AbstractBusinessObject;
import br.ucb.rest.persistencia.dao.GenericDAO;
import br.ucb.rest.persistencia.vo.CategoriaVO;

public class CategoriaBOS extends AbstractBusinessObject {
	private static CategoriaBOS instance;
	private Logger logger = Logger.getLogger(CategoriaBOS.class);
	
	private CategoriaBOS() {
		super();
		logger.info("Singleton instanciado com sucesso!");
	}
	
	public static CategoriaBOS getInstance() {
		if (instance == null) {
			instance = new CategoriaBOS();
		}
		return instance;
	}
	
	
	public List<CategoriaVO> recuperarTodos() {
		EntityManager em = emf.createEntityManager();
		GenericDAO dao = GenericDAO.getInstance(em);
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(CategoriaVO.class);
			criteria.add(Restrictions.eq("inSituacao", Boolean.TRUE));
			criteria.add(Restrictions.isNotEmpty("colCardapioVO"));
			criteria.addOrder(Order.asc("noCategoria"));
			
			List<CategoriaVO> retorno = (List<CategoriaVO>) dao.criteriaListaResultados(criteria);
			
			return retorno;
		}catch (Exception e) {
			logger.error("Ocorreu um erro ao buscar registros no banco de dados!", e);
			return null;
		}finally {
			GenericDAO.liberarInstancia();
			em.close();
		}
	}
	
	public Number qtdCardapioPorCategoria(CategoriaVO vo) {
		EntityManager em = emf.createEntityManager();
		GenericDAO dao = GenericDAO.getInstance(em);
		try {
			Map<String, Object> parametros = new HashMap<String, Object>(1);
			parametros.put("nuCategoria", vo.getNuCategoria());
			
			Number retorno = (Number) dao.namedQueryResultadoUnico("CardapioVO.contarPorCategoria", parametros);
			
			return retorno;
			
		}catch (Exception e) {
			logger.error("Ocorreu um erro ao buscar registros no banco de dados!", e);
			return null;
		}finally {
			GenericDAO.liberarInstancia();
			em.close();
		}
	}

}
